﻿#ifndef DATAOPERATE_H
#define DATAOPERATE_H

#include <QObject>
#include <QPointF>
#include <QFile>
#include <QFileInfo>
#include <QDir>

#include "global.h"
#include "plotchartutils.h"


typedef void (*FUNC)(int);

class DataOperate : public QObject
{
    Q_OBJECT
public:
    explicit DataOperate(QObject *parent = nullptr);

signals:

public slots:

public:

    // 获取INI配置文件信息
    void getIniConfData();
    void getIniConfData(QString path);

    // 获取QList<ConfData>的值
    void getCntConfDataValue(QList<ConfData> &listConfData);

    // 获取
    QList<ConfData> getListConfData();

    // 设置UUID
    QString setUUID(int index, QString name);
    int getIndexByUUID(QString UUID);


    // 监测UUID
    bool verifyUUID(QString strUUID, int index, QString name);

    // 检查线数据
    void verifyData();

    // for循环模板
    void forTemplate(int a, FUNC);

    // 将获取的INI数据转化成QCustomPlot需要的数据
    void mapDataToVector(int lineIndex, QList<QPointF> pointList, QVector<double> &x, QVector<double> &y);
    void mapDataToVector(QString uuid, int pointIndex, QVector<double> &x, QVector<double> &y, double xValue, double yValue);

    // 图表数据初始化
    QList<ConfData> initChartData();

    // 添加线数据
    void addLineData(int index, QString name, QVector<double> x, QVector<double> y);

    // 添加点数据
    void addPointData(QString UUID, double x, double y);

    // 修改点数据
    void modifyPointData(QString UUID, int pointIndex, double x, double y);

    // 删除线数据
    void delLineData(QString UUID);

    // 删除点数据
    void delPointData(QString UUID, int pointIndex);

    // 四舍五入X轴坐标
    int roundAxisValue(double x);

    // 获取最大的横坐标
    int getMaxXAxisValue(QList<QPointF> pointFList);

    // 设置Y轴的数据
    int setYAxisValue(int lineIndex, int yValue);

    // 获取Y轴最大值
    int getYAxisMaxValue();

    // 设置新加线的索引
    int getAddNewLineIndex();

    // 获取数据的最大index值
    int getConfDataMaxIndex();

    // 获取新加线的线名称
    QString getAddNewLineName(int index);

    // 将QVector转化成QPointF
    QList<QPointF> vectorToPointFValue(QVector<double> x, QVector<double> y);
    void pointToVectorValue(QList<QPointF> listPointf, QVector<double> &x, QVector<double> &y);

    // 清空全部数据
    void clearAllData();

    // 获取某条线的数据
    QList<QPointF> getLineDataByIndex(QString UUID);

    // 获取某条线的index值
    int getLineIndexByUUID(QString UUID);

    // 根据点坐标获取点所在直线，是第几个点
    void getPointInfoByPointValue(QString &UUID, int &pointIndex, QPointF pointF);

    // 将坐标转化成具体的坐标点
    qreal getPointYValueByConfYValue(int cntIndex, qreal y);

    // Y的坐标值转化位需要的 0，1值
    int getConfYValueByPointYValue(int cntIndex, qreal y);

    // 获取当前数据的最大值
    int getConfDataLen();

    // 检查当前线是否超过最大索引
    bool chkCntLintPassMaxIndex(int lineIndex);

    // 重新渲染数据
    void reRenderConfData();

    // 渲染当前数据
    void renderConfData();

    // 获取全部数据
    void getGlobalDataInfos();

    // 设置保存文件的文件名
    void setSaveFileName(QString fileName);

    // 保存Conf数据
    void saveChangedConfData();

    // 另存为Conf数据
    void saveAnOtherDataFile(QString fileName);

    // 上移数据
    void moveUpLine(QList<ConfData> &listConfData, QString UUID);

    // 下移数据
    void moveDownLine(QList<ConfData> &listConfData, QString UUID);

    // 查看当前y的数据是否在有效范围
    bool chkCntYIsValidRange(double yValue, int &cntLineIndex);

    // 查看当前范围是否存在
    bool chkNowRangeIsExist(int cntLineIndex);

    //    // 设置插入点的数据
    //    void insertPosData(int cntIndex);

    // 是否上移
    int isUpFlagValue(int lineIndex, int arrIndex);

    // 根据图表UUID,保存修改的图例名称
    void modidyConfLegendByUUID(QString UUID, QString newName);

    // 获取cbox数据
    QList<QString> getCBoxFilesData();

    // 判断目录是否存在，不存在就创建
    void existNotMkDir(QString fileName);
    bool chkDirIsExis(QString dirPath);

    // dirNotMkDir
    bool dirNotMkDir(QString dirPath);

    // 文件操作
    void clearFileInfos(QString fileName);
    bool delFileInfos(QString fileName);
    bool checkFileIsExist(QString fileName);


    // 获取两点中间的数据
    int getLineMidValue(QString UUID);
    QMap<QString, int> getAllLineMidValue();

    // 获取影响的曲线间隔
    void getNextLineDelayTime();

    int* readTData();





private:
    QList<ConfData> m_listConfData; // 全部数据
    qreal m_checkRange;  // 点的检测范围默认位0.3
    int m_maxRangeY; // y轴坐标
    QString m_saveFileName; // 保存文件名

    bool m_isUpFlag; // 删除线后是否上移重绘


};

#endif // DATAOPERATE_H
